package com.zf.jdk_new;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * jdk18新特性正式版：
 * - 现在javadoc 中支持了代码片段，使用snippet，内部可以自动高亮且保持格式
 * - 提供了简单的web服务器
 * - 改进了 Method、Constructor 的实现逻辑，使反射更快，且没有改动过API
 */
public class Jdk18Release {
    public static void main(String[] args) throws Exception {
        testReflect();
    }

    /**
     * jdk18之前使用 <pre>{@code ...}</pre> 在javadoc中引入代码片段。
     * 现在javadoc 中支持了代码片段，使用snippet，内部可以自动高亮且保持格式
     * {@snippet :
     * int abs = Math.abs(-5);
     * if (abs > 5) {
     *     System.out.println(true);
     * } else {
     *     System.out.println(false);
     * }
     *}
     */
    public static void testCode() {
        int abs = Math.abs(-5);
        if (abs > 5) {
            System.out.println(true);
        } else {
            System.out.println(false);
        }
    }


    /**
     * <pre>{@code
     *    int ta = a;
     *    ta = 20;
     * }</pre>
     *
     * @param a
     */
    public static void setTr(Integer a) {
        int ta = a;
    }

    /**
     * 改进了 Method、Constructor 的实现逻辑，是反射更快，且没有改动过API
     */

    public static void testReflect() throws Exception {
        Jdk18Release test = new Jdk18Release();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            Method method = Jdk18Release.class.getDeclaredMethod("setTr", Integer.class);
            method.setAccessible(true);
            method.invoke(test, 10);
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);


        long s1 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            Constructor<Jdk18Release> constructor = Jdk18Release.class.getConstructor();
            constructor.setAccessible(true);
            Jdk18Release instance = constructor.newInstance();
        }
        long s2 = System.currentTimeMillis();
        System.out.println(s2 - s1);
    }
}
